package com.mongoosehome.web.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

/**
 * System 项目配置文件加载器
 */
public class BaseResource {

    static Logger logger = Logger.getLogger(BaseResource.class);
    private Map<String, String> resourcesMap = null;                   // 简单信息配置列表Map,按代码
    private List<?> resourceList = null;
    private static BaseResource instance = new BaseResource();

    private BaseResource() {
    }

    public static void initGlobals(String appPath) throws Exception {
        logger.info("Loading SimpleResource.xml ......");
        instance.initConfig(appPath);
        logger.info("Load SimpleResource.xml complete.");
    }

    private void initConfig(String appPath) throws Exception {
        File resourceFile = new File(appPath);
        if (!resourceFile.isFile()) {
            throw new IOException("The config file does not exist.");
        }

        // 循环每一个资源文件进行处理
        resourcesMap = new HashMap<String, String>();
        try {
            this.initConfigInfo(resourceFile);
        } catch (Exception e) {
            logger.error(e.getStackTrace());
        }
    }

    /**
     * 初始化简单信息配置
     *
     * @throws UserMsgException
     */
    private void initConfigInfo(File resourceFile) throws Exception {
        // 解析配置的信息
        try {
            // 新建立构造器
            logger.warn("resourceFile.getAbsolutePath()==" + resourceFile.getAbsolutePath());
            SAXBuilder sb = new SAXBuilder();
            Document doc = sb.build(new FileInputStream(resourceFile.getAbsolutePath()));

            // 取得根节点以及根节点下一层所有节点
            Element root = doc.getRootElement();

            List<?> children = root.getChildren();
            for (int j = 0; j < children.size(); j++) {
                Element item = (Element) children.get(j);
                String name = item.getAttributeValue("name");
                String context = item.getTextTrim();
                if (null == name || name.length() == 0 || null == context || context.length() == 0) {
                    continue;
                }
                resourcesMap.put(name, context);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取指定KeyName所配置的值
     *
     * @param keyName 关键字
     * @return 资源中所配置的值
     */
    public static String getValue(String keyName) {
        if (null == instance || null == instance.resourcesMap || instance.resourcesMap.isEmpty()) {
            return null;
        } else {
            if (instance.resourcesMap.containsKey(keyName)) {
                return instance.resourcesMap.get(keyName);
            } else {
                return null;
            }
        }
    }

    /**
     * 获取指定KeyName所配置的int值
     *
     * @param keyName 关键字
     * @return 资源中所配置的int值
     */
    public static int getIntValue(String keyName) {
        String value = getValue(keyName);
        if (StringUtils.isFine(value)) {
            return Integer.parseInt(value);
        } else {
            return 0;
        }
    }

    /**
     * 获取指定KeyName所配置的long值
     *
     * @param keyName 关键字
     * @return 资源中所配置的long值
     */
    public static long getLongValue(String keyName) {
        String value = getValue(keyName);
        if (StringUtils.isFine(value)) {
            return Long.parseLong(value);
        } else {
            return 0l;
        }
    }

    /**
     * 获取配置文件的值
     *
     * @return
     */
    public static List<?> getResourcesList() {
        if (null == instance || null == instance.resourceList || instance.resourceList.isEmpty()) {
            return null;
        } else {
            return instance.resourceList;
        }
    }

    /**
     * 获取预加载的配置文件
     *
     * @param key
     * @return
     */
    public static List<String> getPreLoadConfigFiles(String key) {
        String conf = getValue(key);
        List<String> list = new ArrayList<String>();
        if (StringUtils.isFine(conf)) {
            String[] files = conf.split("\\|");
            list.addAll(Arrays.asList(files));
        }
        return list;
    }

    /**
     * 获取路径，适应各种配置。
     *
     * @param path
     * @param separator 分隔符号
     * @param frontNeedSeparator 表示最前面需要文件分隔符。
     * @param behindNeedSeparator 表示最后面需要文件分隔符。
     * @return
     */
    public static String getPathValue(String path,String separator,boolean frontNeedSeparator, boolean behindNeedSeparator) {
        String pathValue = getValue(path);
        if (frontNeedSeparator) {
            if (!pathValue.startsWith(separator)) {
                pathValue = separator+pathValue;
            }
        } else {
            if (pathValue.startsWith(separator)) {
                pathValue = pathValue.substring(1);
            }
        }

        if (behindNeedSeparator) {
            if (!pathValue.endsWith(separator)) {
                pathValue += separator;
            }
        } else {
            if (pathValue.endsWith(separator)) {
                pathValue = pathValue.substring(0,pathValue.length()-1);
            }
        }       
        return pathValue;
    }
}
